
import UIKit

import ReactiveCocoa

import SDWebImage

/// 微博列表的师徒模型 - 分离网络方法
class StatusListViewModel: NSObject {
    
    // 微博数据数组 - 
    // since_id  第一项
    // max_id  最后一项
    
    
    var status = [StatusViewModel]()
    
    
    
    
    ///  加载微博数据
    ///
    ///  - parameter isPullupRefrsh: 是否上拉刷新
    ///
    ///  - returns:  RACSignal
    func loadStatus(isPullupRefrsh isPullupRefrsh:Bool) ->RACSignal{
        
        // 初始刷新： status  数组没有内容
        // 下拉刷新： 取 status  的第一项的 id  作为 since_id 
        var since_id = status.first?.status.id ?? 0 //(status.count ?? 0) == 0 ? 0 : (status.first as! StatusViewModel).status.id
        var max_id = 0
        // 上拉刷新 去status 的最后一项作为 max_id 的最后一项
        if isPullupRefrsh{
            since_id = 0
            max_id = status.last?.status.id ?? 0
            //(status.last as! StatusViewModel).status.id
        }
        
    
        // RACSignal 在订阅的时候，会对 self  进行强引用，sendCompleted  说明信号完成，会释放对 self  的强引用
        // 以下代码 不存在循环引用，但是为了保险，可以使用 [weak self] 防范 
        // 这时候需要 将 下面的self 改成  self?
        return RACSignal.createSignal({[weak self] (subscriber) -> RACDisposable! in
            
            //网络工具，执行的时候，会对 self 进行强引用，网络访问结束后，会对 self 的引用释放
            NetworkTools.sharedTools.loadStatus(since_id: since_id, max_id: max_id).subscribeNext({ (result) -> Void in
                
                //1. 获取 result 中的  statues  字典数组
                guard let array = result["statuses"] as? [[String:AnyObject]] else {
                    
                    subscriber.sendError(NSError(domain: "com.fanglanfeng.error", code: -1002, userInfo: ["error":"没有正常数据"]))
                    
                    printLog("没有正确的数据")
                    
                    return
                }
//                printLog(array)
                
                //2. 字典转模型
                //2.1 遍历数组
                
                // 定义并创建一个临时数组，记录当前网络请求返回的结果
                var arrayM = [StatusViewModel]()
                
                for dict in array{
                    arrayM.append(StatusViewModel(status:Status(dict: dict)))
                }
                printLog("刷新到 \(arrayM.count)条微博")

                self?.cacheWebImage(arrayM ){
                    
                    if max_id > 0{ // 将更新数据拼接在现有数组的末尾
                    
                        self?.status += arrayM
                    } else{  // 下拉刷新  ，初始刷新，  默认刷新
                    
                        self?.status = arrayM + self!.status
                    }
                    
                    // 如果是下拉刷新，提示用户
                    if since_id > 0{
                        // RAC 是OC 的，通知订阅者，下拉刷新的数据
                        subscriber.sendNext(arrayM.count)
                    }
                    
                    //printLog(self?.status)
                    //3.通知调用方
                    subscriber.sendCompleted()
                }
                
                }, error: { (error) -> Void in
                    subscriber.sendError(error)
                    
                    print(error)
                }) {}
            
            return nil
        })
    }
    
    private func cacheWebImage(array:[StatusViewModel],fined:() -> ()){
    
        // 1.定调度组
        let group = dispatch_group_create()
        
        // 遍历视图模型数组
        for viewMode in array{
        
//            printLog(viewMode.thumbnailURLs)
            
            // 目标：只需要 缓存单张图片
            let count = viewMode.thumbnailURLs?.count ?? 0
            
            if count != 1{
                continue
            }
            
            //printLog(viewMode.thumbnailURLs)
            
            //2.  入组 - 锦衣儿中 block ,enter & leave 要配对 出现
            dispatch_group_enter(group)
            
            SDWebImageManager.sharedManager().downloadImageWithURL(viewMode.thumbnailURLs![0], options: [], progress: nil, completed: { (image, _, _, _, _) in
                
                //代码执行捯饬，图片已经缓存完成
                
                // 3. 出组 - block  的最后一句 
                dispatch_group_leave(group)
            })
            
        }
        //4. 调度组 监听 
        dispatch_group_notify(group, dispatch_get_main_queue()) { () -> Void in
            
            //printLog("缓存图片完成")
            
            // 执行闭包 
            fined()
        }
    }
}










